#include "spi_v1.hpp"  // 假设您的头文件
#include <iostream>
#include <array>
#include <stdexcept>
#include <chrono>    // for timing
#include <thread>    // for sleep
#include <iomanip>   // for hex output

int main() {
    try {
        // 配置：降低速度到100kHz，模式0（稍后测试其他模式）
        spi_v1 spi("/dev/spidev0.0", 1000000, spi_v1::spi_mode_1, 8);

        // 测试参数
        const int num_tests = 20;  // 运行20次以观察稳定性
        int success_count = 0;
        std::array<uint8_t, 4> tx = {0x55, 0xAA, 0x33, 0xCC};  // 易识别模式，非0xFF
        std::array<uint8_t, 4> rx = {0};

        for (int i = 0; i < num_tests; ++i) {
            // 清空rx
            std::fill(rx.begin(), rx.end(), 0);

            // 传输
            spi.transfer_and_recv(tx.data(), tx.size(), rx.data(), rx.size());

            // 检查是否匹配
            bool match = true;
            std::cout << "Test " << i + 1 << ": TX: ";
            for (auto byte : tx) std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte) << " ";
            std::cout << "\nRX: ";
            for (auto byte : rx) {
                std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte) << " ";
                if (byte != tx[&byte - rx.data()]) match = false;  // 比较
            }
            std::cout << (match ? " [MATCH]" : " [MISMATCH]") << std::endl;

            if (match) ++success_count;

            // 添加延迟，避免连续传输干扰（100ms）
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }

        std::cout << "Success rate: " << (success_count * 100 / num_tests) << "%" << std::endl;

        // 测试不同模式（手动更改并重新编译运行）
        // spi.setMode(SPI_MODE_1);  // 试试模式1、2、3

    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}
